#region Using

using Microsoft.Xna.Framework;
using XNgine.Misc;

#endregion

namespace XNgine.CameraManagement
{
    public interface ICamera : INamedItem
    {
        #region FOV, NearPlane, FarPlane

        /// <summary>
        /// The viewable angle.
        /// </summary>
        float FieldOfView { get; set; }

        /// <summary>
        /// Slightly smaller viewable field of view for culling.
        /// </summary>
        float ViewableFieldOfView { get; }

        /// <summary>
        /// The near plane used to determine the viewable area.
        /// </summary>
        float NearPlane { get; set; }

        /// <summary>
        /// The far plane used to determine the viewable area.
        /// </summary>
        float FarPlane { get; set; }

        #endregion

        #region Frustum

        /// <summary>
        /// The trapezoid that contains everything that the camera can see.
        /// </summary>
        BoundingFrustum Frustum { get; }

        #endregion

        #region Position

        Vector3 Position { get; set; }

        #endregion

        #region Target, Up (Other directional vectors)

        Vector3 Target { get; set; }
        Vector3 Up { get; set; }
        // There vectors are automaticly calculated using Position, Target and Up vectors
        Vector3 Forward { get; }
        Vector3 Backward { get; }
        Vector3 Right { get; }
        Vector3 Left { get; }
        Vector3 Down { get; }

        #endregion

        #region View, Projection

        Matrix View { get; }
        Matrix Projection { get; }

        #endregion

        #region Main loop

        void Update();

        #endregion
    }
}